package NetWork;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;

/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: 故我
 * Date: 2023-10-19
 * Time: 22:30
 */
public class UdpEchoServer {
    //socket对象
    private DatagramSocket socket = null;

    //服务器需要绑定一个端口号
    public UdpEchoServer(int port) throws SocketException {
        socket = new DatagramSocket(port);
    }

    //启动服务器
    public void Start() throws IOException {
        System.out.println("服务器启动!");
        while (true) {
            DatagramPacket recvPacket = new DatagramPacket(new byte[4096], 4096);
            socket.receive(recvPacket);//接收一个数据报
            //接收到数据报之后，需要对这个数据报进行特殊处理构建成一个字符串风格的数据
            String recvStr = new String(recvPacket.getData(), 0, recvPacket.getLength());
            //根据接收的数据，对数据进行业务的处理，这里只是一个回显的效果
            String handleRecv = functor(recvStr);
            //用这个处理后的数据，对数据报进行填充并发送  字节  字节长度（不是字符） 和对端的地址信息
            DatagramPacket respPacket = new DatagramPacket(handleRecv.getBytes(), handleRecv.getBytes().length, recvPacket.getSocketAddress());
            socket.send(respPacket);
            //Address 只是IP地址，SocketAddress 是端口号 + IP地址
            System.out.printf("[%s:%d]# recv: %s resp: %s\n", recvPacket.getAddress().toString(), recvPacket.getPort(), recvStr, handleRecv);
        }

    }

    public String functor(String recvStr) {
        return recvStr;
    }

    public static void main(String[] args) throws IOException {
        UdpEchoServer server = new UdpEchoServer(9090);
        server.Start();
    }
}

